home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / WINDOWS / LENGINE.ZIP / APPMAIN.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1996-12-12  |  6.0 KB  |  249 lines

  1. #include "header.h"
  2.  
  3. DirectDraw                *DD;
  4. UINT                    KeyBuf[10];
  5. WINAPP                    WinApp;
  6. BOOL                    bWorldOpen = FALSE;
  7. WORLD                    *World;
  8. DWORD                    Time1, Time2;
  9. long                    Speed;
  10. int                     CameraMove();
  11.  
  12. void DrawSpeedBar(char *scr);
  13. void BltBitmaps();
  14.  
  15. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR, int cmdShow)
  16. {
  17.     HWND        MainWnd;
  18.     MSG         msg;
  19.     WNDCLASS    WndClass;
  20.  
  21.     WinApp.hInstance = hInstance;
  22.     WinApp.hPrevInst = hPrevInst;
  23.     WinApp.cmdShow   = cmdShow;
  24.  
  25.     WndClass.style          = CS_HREDRAW | CS_VREDRAW;
  26.     WndClass.lpfnWndProc    = WndProc;
  27.     WndClass.cbClsExtra     = 0;
  28.     WndClass.cbWndExtra     = 0;
  29.     WndClass.hInstance      = hInstance;
  30.     WndClass.hIcon          = LoadIcon(WinApp.hInstance, IDI_APPLICATION);
  31.     WndClass.hCursor        = LoadCursor(NULL, IDC_ARROW);
  32.     WndClass.hbrBackground  = (HBRUSH)(GetStockObject(BLACK_BRUSH));
  33.     WndClass.lpszMenuName   = NULL;
  34.     WndClass.lpszClassName  = "MAINWND";
  35.     RegisterClass(&WndClass);
  36.  
  37.     DD = new DirectDraw();
  38.     MainWnd = CreateWindowEx(
  39.         WS_EX_TOPMOST,
  40.         "MAINWND",
  41.         "Direct Draw Example",
  42.         WS_POPUP,
  43.         0, 0,
  44.         GetSystemMetrics(SM_CXSCREEN),
  45.         GetSystemMetrics(SM_CYSCREEN),
  46.         NULL,
  47.         NULL,
  48.         hInstance,
  49.         NULL );
  50.  
  51.     ShowWindow(MainWnd, WinApp.cmdShow);
  52.     UpdateWindow(MainWnd);
  53.  
  54.     DD->SetDefaults(MainWnd, 2);
  55.     DD->SetMode(M640x480x8);
  56.     DD->CreateViewBuffers();
  57.     SetupData();
  58.                 
  59.     while(1)
  60.     {
  61.         if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
  62.         {
  63.             if(msg.message == WM_QUIT)
  64.                 break;
  65.             TranslateMessage(&msg);
  66.             DispatchMessage(&msg);
  67.         }
  68.         else if(bWorldOpen)
  69.             Heartbeat();
  70.         else
  71.             WaitMessage();
  72.     }
  73.     delete DD;
  74.     return 0;
  75. };
  76.  
  77. LRESULT CALLBACK _export WndProc(HWND hWindow, UINT message, WPARAM wParam, LPARAM lParam)
  78. {
  79.     switch(message)
  80.     {
  81.         case WM_CREATE:
  82.             World = new WORLD();
  83.             World->LoadWorld("land.wld");
  84.             bWorldOpen = TRUE;
  85.             Time2 = 0; Time1 = timeGetTime();
  86.             Speed = 16;
  87.             return 0;
  88.         case WM_SETCURSOR:
  89.             ShowCursor(NULL);
  90.             return 0;
  91.         case WM_KEYDOWN:
  92.             switch(wParam)
  93.             {
  94.                 case VK_LEFT: KeyBuf[LEFT] = 1; break;
  95.                 case VK_RIGHT: KeyBuf[RIGHT] = 1; break;
  96.                 case VK_ADD: KeyBuf[SPEEDUP] = 1; break;
  97.                 case VK_SUBTRACT: KeyBuf[SPEEDDOWN] = 1; break;
  98.             }
  99.             return 0;
  100.         case WM_KEYUP:
  101.             switch(wParam)
  102.             {
  103.                 case VK_LEFT: KeyBuf[LEFT] = 0; break;
  104.                 case VK_RIGHT: KeyBuf[RIGHT] = 0; break;
  105.                 case VK_ADD: KeyBuf[SPEEDUP] = 0; break;
  106.                 case VK_SUBTRACT: KeyBuf[SPEEDDOWN] = 0; break;
  107.             }
  108.             return 0;
  109.         case WM_COMMAND:
  110.             switch(wParam)
  111.             {
  112.                 case 101:
  113.                     SendMessage(hWindow, WM_DESTROY, 0, 0L);
  114.                     return 0;
  115.             }
  116.             return(DefWindowProc(hWindow, message, wParam, lParam));
  117.         case WM_CLOSE:
  118.         case WM_DESTROY:
  119.             bWorldOpen = FALSE;
  120.             ShowCursor(TRUE);
  121.             World->FreeWorld();
  122.             delete World;
  123.             PostQuitMessage(0);
  124.             return 0;
  125.         default:
  126.             return(DefWindowProc(hWindow, message, wParam, lParam));
  127.     }
  128. };
  129.  
  130. int SetupData()
  131. {
  132.     HDIB Dib;
  133.  
  134.     Dib.Load("ALLBMPS.BMP");
  135.     DD->lpPal = DD->ExtractPalette(Dib);
  136.     DD->lpFront->SetPalette(DD->lpPal);
  137.     Dib.Free();
  138.     DD->AddBitmap("earth.bmp");
  139.     DD->AddBitmap("statbar.bmp");
  140.     return 0;
  141. };
  142.  
  143. int Heartbeat()
  144. {
  145.     DDSURFACEDESC Desc;
  146.     HRESULT    Result;
  147.     char *scr;
  148.  
  149.     Time2 = timeGetTime() - Time1;
  150.     Time1 = timeGetTime();
  151.     DD->Clear(0);
  152.     CameraMove();
  153.     BltBitmaps();
  154.     World->UpdateWorld();
  155.     World->ProjectWorld(250);
  156.     memset(&Desc, 0, sizeof(Desc));
  157.     Desc.dwSize = sizeof(Desc);
  158.     Result = DD->lpBack->Lock(NULL, &Desc, DDLOCK_WAIT, NULL);
  159.     DD->Pitch = Desc.lPitch;
  160.     scr = (char *)Desc.lpSurface;
  161.     World->DrawWorld(scr);
  162.     DrawSpeedBar(scr);
  163.     DD->lpBack->Unlock(NULL);
  164.     DD->Flip();
  165.  
  166.     return(0);
  167. };
  168.  
  169. int CameraMove()
  170. {
  171.     float newp, newc, tspeed;
  172.         
  173.     if(KeyBuf[LEFT])
  174.         World->Camera[World->Current_Camera].yAngle -= .0006 * Time2;
  175.     if(KeyBuf[RIGHT])
  176.         World->Camera[World->Current_Camera].yAngle += .0006 * Time2;
  177.     if(KeyBuf[SPEEDUP]) Speed += 2;
  178.     if(KeyBuf[SPEEDDOWN]) Speed -= 2;
  179.     if(Speed < 0) Speed = 0;
  180.     if(Speed > 106) Speed = 106;
  181.  
  182.     if(World->Camera[World->Current_Camera].yAngle < 0.0)
  183.         World->Camera[World->Current_Camera].yAngle += 6.28;
  184.     if(World->Camera[World->Current_Camera].yAngle > 6.28)
  185.         World->Camera[World->Current_Camera].yAngle -= 6.28;
  186.     if(World->Camera[World->Current_Camera].xAngle < 0.0)
  187.         World->Camera[World->Current_Camera].xAngle += 6.28;
  188.     if(World->Camera[World->Current_Camera].xAngle > 6.28)
  189.         World->Camera[World->Current_Camera].xAngle -= 6.28;
  190.         
  191.     tspeed = (float)(Time2 / 24.0) * (float)Speed;
  192.     newp = tspeed * cos(World->Camera[World->Current_Camera].yAngle);
  193.     newc = World->Camera[World->Current_Camera].zTrans + newp;
  194.     if(newc >= 0 && newc < 261120)
  195.         World->Camera[World->Current_Camera].zTrans += newp;
  196.  
  197.     newp = tspeed * sin(World->Camera[World->Current_Camera].yAngle);
  198.     newc = World->Camera[World->Current_Camera].xTrans + newp;
  199.     if(newc >= 0 && newc < 261120)
  200.         World->Camera[World->Current_Camera].xTrans += newp;
  201.     return(0);
  202. };
  203.  
  204. void DrawSpeedBar(char *Screen)
  205. {
  206.     int i;
  207.     char *start;
  208.  
  209.     for(i = 0; i < Speed >> 1; i++)
  210.     {
  211.         start = (char *)Screen + ((474 - i) * DD->Pitch) + 74;
  212.         memset(start, 70, 13);
  213.     }
  214. };
  215.  
  216. void BltBitmaps()
  217. {
  218.     RECT src, des;
  219.     float angle;
  220.  
  221.     src.left = 0; src.right = 64;
  222.     src.top = 0; src.bottom = 56;
  223.     angle = World->Camera[World->Current_Camera].yAngle;
  224.     if(angle > 3.14159) angle -= 6.28;
  225.     des.left = -256 * angle;
  226.     des.right = 64 + des.left;
  227.     angle = World->Camera[World->Current_Camera].xAngle;
  228.     if(angle > 3.14159) angle -= 6.28;
  229.     des.top = 256 * angle;
  230.     des.bottom = 56 + des.top;
  231.     if(des.right > 640)
  232.     {
  233.         src.right -= des.right - 640;
  234.         des.right = 640;
  235.     }
  236.     if(des.left < 0)
  237.     {
  238.         src.left -= des.left;
  239.         des.left = 0;
  240.     }
  241.     DD->BltBitmap(DD->lpDib[0], src, des);
  242.     src.left = 0; src.right = 640;
  243.     src.top = 0; src.bottom = 64;
  244.     des.left = 0; des.right = 640;
  245.     des.top = 480 - 64;    des.bottom = 480;
  246.     DD->BltBitmap(DD->lpDib[1], src, des);
  247. };
  248.     
  249.